home *** CD-ROM | disk | FTP | other *** search
/ The CICA Windows Explosion! / The CICA Windows Explosion! - Disc 2.iso / programr / dpmigcc5.zip / RSX / SOURCE / SYSDEP.C < prev    next >
C/C++ Source or Header  |  1994-12-12  |  5KB  |  214 lines

  1. /*****************************************************************************
  2.  * FILE: sysdep.c                                 *
  3.  *                                         *
  4.  * DESC:                                     *
  5.  *    - system functions for 16bit compilers                     *
  6.  *                                         *
  7.  * Copyright (C) 1993,1994                             *
  8.  *    Rainer Schnitker, Heeper Str. 283, 33607 Bielefeld             *
  9.  *    email: rainer@mathematik.uni-bielefeld.de                 *
  10.  *                                         *
  11.  *****************************************************************************/
  12.  
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <string.h>
  16. #include "DPMI.H"
  17. #include "RMLIB.H"
  18. #include "PROCESS.H"
  19. #include "LOADPRG.H"
  20. #include "RSX.H"
  21. #include "FPU.H"
  22. #include "COPY32.H"
  23. #include "SYSDEP.H"
  24.  
  25. DWORD copro_struct;        /* address of soft-387 struct */
  26. UINT emu_sel = 0;        /* emu data-sel */
  27. DWORD emu_esp;            /* emu esp entry */
  28. POINTER16_32 emu_entry;     /* entry address emu (for init) */
  29.  
  30. static char cline[260];
  31. static char *argvec[50];
  32.  
  33. void save_emu_state(NEWPROCESS * proc)
  34. {
  35.     cpy32_16(emu_sel, copro_struct, &(proc->npx), sizeof(union i387_union));
  36. }
  37.  
  38. void load_emu_state(NEWPROCESS * proc)
  39. {
  40.     cpy16_32(emu_sel, copro_struct, &(proc->npx), sizeof(union i387_union));
  41. }
  42.  
  43. /* load emu & init */
  44. static int init_emu387(char *filename)
  45. {
  46.     if (load_protected_program(filename, npz))
  47.     return -1;
  48.  
  49.     puts("load rsx387");
  50.  
  51.     /* init some emu vars for long-jmp, emu data selector access */
  52.     emu_sel = npz->data32sel;
  53.     emu_esp = npz->stackp32;
  54.     emu_entry.off = npz->entry;
  55.     emu_entry.sel = npz->code32sel;
  56.  
  57.     LockLinRegion(npz->memaddress, npz->membytes);
  58.  
  59.     /* emu_init call emulator to install exception handler */
  60.     copro_struct = emu_init();
  61.     /* return the 387-register struct, need for switching prgs */
  62.  
  63.     return 0;
  64. }
  65.  
  66. int install_rsx387()
  67. {
  68.     static char rsx387_default[] = "\\RSX\\FPU-EMU\\RSX387";
  69.     char *emu_name;
  70.  
  71.     emu_name = getenv("RSX387");
  72.     if (emu_name == NULL) {
  73.     if (rm_access(rsx387_default, 0)) {
  74.         puts("Can't find RSX387");
  75.         return -1;
  76.     } else
  77.         emu_name = rsx387_default;
  78.     }
  79.     if (init_emu387(emu_name) == -1) {
  80.     printf("Can't load emu: %s\n", emu_name);
  81.     return -1;
  82.     }
  83.     return 0;
  84. }
  85.  
  86. /* convert PSP to command line */
  87. void get_emxl_psp(unsigned emxl_psp)
  88. {
  89.     int z, env_seg;
  90.     char far *cmdl;
  91.  
  92.     /* get envoronment segment from PSP */
  93.     env_seg = *(int far *) ((DWORD) emxl_psp << 16 | 0x2c);
  94.  
  95.     /* build far pointer to environment */
  96.     cmdl = (char far *) ((DWORD) env_seg << 16);
  97.  
  98.     /* skip env-strings ; last has two 0-bytes */
  99.     for (; cmdl++;)
  100.     if (*cmdl == '\0' && *(cmdl + 1) == '\0')
  101.         break;
  102.  
  103.     cmdl += 4;
  104.     /* copy arg0 */
  105.     for (z = 0; *cmdl != '\0'; cmdl++, z++)
  106.     cline[z] = *cmdl;
  107.     cline[z++] = ' ';
  108.  
  109.     /* build cmdline far pointer from PSP */
  110.     cmdl = (char far *) ((DWORD) emxl_psp << 16 | 0x81);
  111.  
  112.     /* copy arg1,arg2,... */
  113.     for ( ; z < sizeof(cline) ; z++) {
  114.     cline[z] = *cmdl;
  115.     if (cline[z] == 13)
  116.         break;
  117.     cmdl++;
  118.     }
  119.     cline[z] = '\0';
  120. }
  121.  
  122. /* make command string to argv */
  123. void build_emx_args(int *argn, char ***argvp)
  124. {
  125.     int argc, src, dst, bs, quote;
  126.     char *q;
  127.  
  128.     argc = 0;
  129.     dst = src = 0;
  130.     while (cline[src] == ' ' || cline[src] == '\t' || cline[src] == '\n')
  131.     ++src;
  132.     do {
  133.     if (cline[src] == 0)
  134.         q = NULL;
  135.     else {
  136.         q = cline + dst;
  137.         bs = 0;
  138.         quote = 0;
  139.         for (;;) {
  140.         if (cline[src] == '"') {
  141.             while (bs >= 2) {
  142.             cline[dst++] = '\\';
  143.             bs -= 2;
  144.             }
  145.             if (bs & 1)
  146.             cline[dst++] = '"';
  147.             else
  148.             quote = !quote;
  149.             bs = 0;
  150.         } else if (cline[src] == '\\')
  151.             ++bs;
  152.         else {
  153.             while (bs != 0) {
  154.             cline[dst++] = '\\';
  155.             --bs;
  156.             }
  157.             if (cline[src] == 0 ||
  158.             ((cline[src] == ' ' || cline[src] == '\t') && !quote))
  159.             break;
  160.             cline[dst++] = cline[src];
  161.         }
  162.         ++src;
  163.         }
  164.         while (cline[src] == ' ' || cline[src] == '\t'
  165.            || cline[src] == '\n')
  166.         ++src;
  167.         cline[dst++] = 0;
  168.     }
  169.     argvec[argc++] = q;
  170.     } while (q != NULL);
  171.  
  172.     *argvp = (char **) &(argvec[0]);
  173.     *argn = argc - 1;
  174. }
  175.  
  176. #define MK_LP(seg,o) (void far *) (DWORD) ((((DWORD)(seg)) << 16) | (WORD)(o))
  177.  
  178. void build_dj_args(int *argc, char ***argv)
  179. {
  180.     int narg, i;
  181.     char **args = *argv;
  182.     int segm, off;
  183.     int far *old_argv;
  184.     char far *old_argi;
  185.  
  186.     sscanf(args[2], "%x", &narg);
  187.     sscanf(args[3], "%x", &segm);
  188.     sscanf(args[4], "%x", &off);
  189.     old_argv = (int far *) MK_LP(segm, off);
  190.     argvec[0] = cline;
  191.     for (i = 0; i < narg; i++) {
  192.     old_argi = (char far *) MK_LP(segm, (old_argv[i]));
  193.     _fstrcpy((char far *) (argvec[i]), old_argi);
  194.     argvec[i + 1] = argvec[i] + (strlen(argvec[i]) + 1);
  195.     }
  196.     argvec[narg] = 0;
  197.  
  198.     *argv = (char **) &(argvec[0]);
  199.     *argc = narg;
  200. }
  201.  
  202. void set_stdout(void)
  203. {
  204.     setbuf(stdout,NULL);
  205.     setbuf(stderr,NULL);
  206. }
  207.  
  208. void flush_all_buffers(void)
  209. {
  210.     fflush(stdin);
  211.     fflush(stdout);
  212.     fflush(stderr);
  213. }
  214.